一想到資料結構就感到很複雜的一些觀念
最早使用電腦的主因是要用來儲存及管理一些資料,這也是資料結構觀念的由來。當我們要求電腦解決問題時,必須以電腦了解的模式來描述問題,資料結構是資料的表示法,也就是電腦中儲存資料的方法。
資料結構就是資料進入電腦化處理的一套完美邏輯。像程式設計師必須用資料結構來進行資料的新增、刪除、修改、儲存等動作,如果在選擇資料結構時做了錯的選擇,那你整個程式會變得沒效率或者變慢,甚至選錯資料型態那真的是會埋了更大的雷。
例如:圖書館會建立所有書的資料,管理人員會依照各個不同的書做種類分類,如年齡分級、書籍類型、作者或主題。分類好把檔案存起來日後有人要來借書時,只要查詢書籍類型作者名稱這樣,即可快速找出所需的書,而這些儲存的分類就是資料結構概念的一種。
先了解一下資料(Data)與資訊(Information)的定義。
資料是指為基處理的文字、數字、符號、圖形等等。還可以再分為兩大類,
數值資料(Numeric Data):就是一般的數值,可用運算子來做運算
文數資料(Alphanumeric Data):像是非數值資料,像是我們看到的地址身分證號碼等等
資訊是將大量的資料,經過有系統的整理、分析、篩選處理,具有參考價值和可用性。
資料結構主要是表示資料在電腦記憶體中所儲存的位置和模式,可分為三種型態:
無法以其他型態定義的資料型態,也稱為純量資料型態,程式語言都會提供基本資料,例如:Rust中的基本資料型態,包括整數、浮點數、布林、字符、陣列等等。
也稱為虛擬資料型態,比基本資料型態更高一層,例如:結構、列舉等等。
對一種資料型態,可將其看成是一種值的集合,以及在這些值上所作的運算與本身代表屬性成的集合。抽象資料型態所代表便是定義這種資料型態所具備的數學關係。
資料結構可透過程式語言提供有效的型別、參照及其他操作。我們知道一個程式能否快速而有效率的完成任務,取決是否選對了資料結構,而程式是否能清楚而正確的把問題解決,取決於演算法。
資料結構加上演算法等於有效率、可執行的程式。
不同種類的資料結構適合不同種類的應用,用適當的資料結構可讓演算法發揮最大效能。接下來會介紹常見的資料結構。
陣列結構是一排緊密的可數記憶體,並提供能夠直接存取單一資料計算方法。
像是每戶的信箱,每個信箱有地址,路名就是名稱,信箱號碼就是索引,可以依照信件上的住址投到信箱,陣列的名稱是表示一塊緊密相鄰記憶體的起始位置,而陣列的索引功能則是用來表示從此記憶體起始位置的第幾個區塊。
陣列的使用可分為一維陣列、二維陣列與多維陣列等等
二維陣列可視為一維陣列的延伸,都是處理相同型態資料,差別只在維度的宣告。
例如:一個含有x * y個元素的二維陣列,x代表列數,y代表行數
在Rust二維宣告格式:
資料型態 二維陣列名 [列大小] [行大小];
// 4X4
let mut arr: [[32; 4]; 4]
這邊是用[]括住每一列的初始值,並以;區隔每個陣列元素
// 2X3
let mut arr: [[i32; 3]; 2] = [[0, 1, 2], [3, 4, 5]];
| | 欄索引[0] | 欄索引[1] | 欄索引[2] |
| -------- | -------- | -------- |
| 列索引[0] | 0 | 1 | 2 |
| 列索引[1] | 3 | 4 | 5 |
三維跟二維一樣,可視為是一維陣列的延伸,陣列為三維陣列時,可看作一個立方體,像是魔術方塊一樣。
上圖就像是arr[2][3][4]三維陣列成魔術方塊。
fn main() {
// 宣告一個3x3x3的整數三維陣列
let arr: [[[i32; 3]; 3]; 3] = [
[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
[[10, 11, 12], [13, 14, 15], [16, 17, 18]],
[[19, 20, 21], [22, 23, 24], [25, 26, 27]],
];
// 三維陣列
for x in 0..3 {
for y in 0..3 {
for z in 0..3 {
print!("{} ", arr[x][y][z]);
}
println!();
}
println!();
}
}
會印出
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20 21
22 23 24
25 26 27
今天先介紹資料結構概念以及陣列的基本,陣列在開發是非常重要且常見的,很常在開發中使用到它,所以這邊先來了解它,後面會再介紹其他資料結構的種類。
目前應該不會太難吧㋡㋡!!
要是哪裡理解上還是邏輯上有錯請各位大大指正,感謝 𓁏𓁏𓁏。